Middleware(中間件)就像工廠流水線上的「檢查站」。當請求(Request)進到伺服器、還沒抵達最終路由處理函數之前,會先經過一連串的中間件進行檢查、記錄或資料處理。
每個中間件函式都可以存取三者:
req (Request 請求物件)res (Response 回應物件)next (呼叫下一個中間件的控制器)[Request] ➔ [Middleware 1: 驗證身份] ➔ [Middleware 2: 記錄日誌] ➔ [Route Handler: 回傳資料] ➔ [Response]
我們可以撰寫全域中間件,記錄每一次請求的 HTTP 方法、網址與進站時間:
// loggerMiddleware.js
const logger = (req, res, next) => {
const now = new Date().toISOString();
console.log(`[${now}] ${req.method} ${req.url}`);
// 必須呼叫 next(),否則 Request 會卡在這裡直到 Timeout!
next();
};
module.exports = logger;
在 app.js 中透過 app.use() 全域載入:
const express = require('express');
const logger = require('./loggerMiddleware');
const app = express();
// 註冊全域 Middleware
app.use(logger);
app.get('/api/users', (req, res) => {
res.json({ message: '取得使用者清單' });
});
app.use(express.json());
cors 或 HTTP 日誌套件 morganapp.use(cors());
// 驗證 API Key 的中間件
const checkApiKey = (req, res, next) => {
const apiKey = req.headers['x-api-key'];
if (!apiKey || apiKey !== 'secret-key-123') {
return res.status(401).json({ error: 'Unauthorized', message: 'API Key 無效或未提供' });
}
next(); // 驗證通過,放行到下一步
};
// 僅套用到特定受保護路由
app.get('/api/admin/data', checkApiKey, (req, res) => {
res.json({ secretData: '這是管理者專屬資料' });
});
next() 是初學者常見的坑,會導致瀏覽器一直處於等待回應(Pending)狀態。